import os

import gradio as gr
from analysis_tools import Analysis_tool
import tempfile
import shutil
import pandas as pd

# 后端方法，用于处理文本输入
def process_text(input_text, x, y, z):
    if len(input_text) == 0:
        return "请在左侧输入文本"
    # 在这里执行后端逻辑，你可以替换成你自己的处理方法
    # processed_result = f"你输入的文本是：{input_text}"
    analysis_result = analysis.process_string(input_text, x, y, z)
    return analysis_result


def upload_file(files):
    file_paths = [file.name for file in files]
    return file_paths


# 处理excel并生成新的excel，返回地址
def generate_file(x,y,z,file_obj):
    global tmpdir
    print('临时文件夹地址：{}'.format(tmpdir))
    print('上传文件的地址：{}'.format(file_obj.name))  # 输出上传后的文件在gradio中保存的绝对地址
    if not os.path.exists(tmpdir):
        os.makedirs(tmpdir)

    # 获取到上传后的文件的绝对路径后，其余的操作就和平常一致了

    # 将文件复制到临时目录中
    shutil.copy(file_obj.name, tmpdir)

    # 获取上传Gradio的文件名称
    FileName = os.path.basename(file_obj.name)

    # 获取拷贝在临时目录的新的文件地址
    NewfilePath = os.path.join(tmpdir, FileName)
    print("NewfilePath:", NewfilePath)

    # 打开复制到新路径后的文件
    with open(NewfilePath, 'rb') as file_obj:
        # 在本地电脑打开一个新的文件，并且将上传文件内容写入到新文件
        outputPath = os.path.join(tmpdir, "New_" + FileName)
        with open(outputPath, 'wb') as w:
            w.write(file_obj.read())

    new_path = analysis.process_excel(outputPath, x, y, z, sheet_name=0, columns=[0], skip_rows=0)
    # 返回新文件的的地址
    return new_path

# 创建一个空的DataFrame，用于存储用户输入的数据
df = pd.DataFrame(columns=['Text', 'Rating'])

# 定义Gradio界面
def add_data(text, rating):
    global df
    # 将用户输入的数据添加到DataFrame中
    new_row = pd.Series({'Text': text, 'Rating': rating})
    df = pd.concat([df, new_row.to_frame().T], ignore_index=True)
    # 将DataFrame保存到本地Excel文件中
    df.to_excel('user_data.xlsx', index=False)
    # 返回当前DataFrame的数据量
    return len(df)

if __name__ == '__main__':
    global tmpdir
    analysis = Analysis_tool(r'D:\resources\stanford-corenlp-full-2018-01-31')
    df = pd.DataFrame(columns=['Text', 'Rating'])
    # todo 增加输入框，将评分因素的权重作为可输入项，由用户输入
    # todo 增加用户评分反馈模块，作为训练数据收集，非必填。
    #  对于单条文本输入的情况，由用户在页面上输入数字。对于excel表格输入的情况，在excel中增加一列的读取，作为分数。
    #  对于收集的数据，将详细日志以及数据存储到本地磁盘的excel中即可，注意另外在一个文本文件中记录当前的数据收集情况，如数据数量等，方便后续训练优化。
    with gr.Blocks() as demo:
        with gr.Tab("单条文本输入"):
            # 创建Gradio接口
            iface = gr.Interface(
                fn=process_text,
                inputs=["text",
                        gr.Number(label="内容量化得分占比（%）", value=60),
                        gr.Number(label="主宾明确度得分占比（%）", value=30),
                        gr.Number(label="语句长度分析得分占比（%）", value=10)],
                outputs="text",
                examples=[["我要好好学习，上课认真听讲，随堂练习不低于90分；每天到家后15分钟就开始做作业，作业做完再吃饭。每天晚上睡前花费15分钟做第二天的预习。力争2个月后的期中考成绩排名进入班级前十名。",
                          60, 30, 10]],
                live=False,
                title="报告灌水检测器-单条文本处理",
                description="在下方输入文本和三种评分方式占总分百分比。点击Submit提交，结果将展示在右侧"
            )

        with gr.Tab("文件批量输入"):
            # 文件上传
            with tempfile.TemporaryDirectory(dir='.') as tmpdir:
                # 定义输入和输出
                inputs = [
                    gr.Number(label="内容量化得分占比（%）", value=60),
                    gr.Number(label="主宾明确度得分占比（%）", value=30),
                    gr.Number(label="语句长度分析得分占比（%）", value=10),
                    gr.components.File(label="上传文件", file_types=["xlsx", "xls"], file_count="single"),
                ]
                outputs = gr.components.File(label="下载文件")
                gr.Interface(fn=generate_file, inputs=inputs, outputs=outputs, title="报告灌水检测器-文件批量处理",
                             description="支持xlsx，请将待处理的数据放到Sheet1的第一列")
        with gr.Tab("用户数据收集"):
            interface=gr.Interface(
                fn=add_data,
                inputs=[
                        gr.Textbox(label="请输入文章内容"),
                        gr.Number(label="请输入评分，0到100")
                         ],
                outputs=gr.Textbox(label="当前数据量"),
                title="用户数据收集",
                description="输入一段话和对应评分，然后点击提交按钮提交")

        with gr.Tab("版本更新公告"):
            gr.Textbox(lines=1, info="更新时间:   20240104", label="版本号:   1.1.0.240104_beta",
                       value="报告灌水检测器初次发布!\n")
            gr.Textbox(lines=3, info="更新时间:   20240109", label="版本号:   1.1.1.240109_beta",
                       value="1、优化评价得分逻辑;\n2、修复已知bug;\n3、优化页面，新增版本更新。\n")
            gr.Textbox(lines=4, info="更新时间:   20240110", label="版本号:   1.1.2.240110_beta",
                       value="1、优化量化检测机制，剔除序号词;\n2、含书名号的句子视为提供量化标准;\n3、新增语句长度分析评分，暂定标准一句字数小于等于100字;\n"
                             "4、修复了文件批量导入中excel空单元格导致的报错问题。\n")
            gr.Textbox(lines=3, info="更新时间:   20240122", label="版本号:   1.1.2.240122_beta",
                       value="1、优化文章评分机制;\n2、将评分因素的权重作为可输入项加入单条文本输入;\n3、将评分因素的权重作为可输入项加入文件批量输入;\n")
            gr.Textbox(lines=3, info="更新时间:   20240202", label="版本号:   1.1.2.240202_beta",
                       value="1、增加用户数据收集标签页;\n2、调整页面结构;\n3、修复了一些运行报错问题;\n")
    # 启动Gradio页面
    demo.launch(server_name="0.0.0.0", server_port=7860, auth=("admin", 'admin123'), )
